package com.losalpes.catalog;

import com.losalpes.persistence.entity.Inventario;
import com.losalpes.persistence.entity.Mueble;
import com.losalpes.persistence.entity.TipoMueble;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.model.SelectItem;

/**
 *
 * @author Camilo Alvarez
 */
public class CatalogBean {

    @EJB
    private ICatalogService catalogService;
    private Mueble mueble = new Mueble();
    private String referencia;
    private List<Mueble> listaMuebles;
    private List<Inventario> listaInventario;
    private Inventario inventario = new Inventario();
    private String ultimaBusqueda = "NN";  // guarda cual fue la última busqueda realizada para repetrila

    public String getReferencia() {
        return referencia;
    }

    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    public CatalogBean() {
        //catalogService = new CatalogServiceMock();
        //this.listaMuebles = (List<Mueble>) catalogService.findAllMuebles();
    }

    public List getMuebles() {
        return this.listaMuebles;
    }

    public int CantidadMuebles() {
        return catalogService.CantidadMuebles();
    }

    public List getMueblesDisponibles() {
        ArrayList<Mueble> mueblesdisponibles = new ArrayList();
        this.getAllInventario();

        Iterator iter = this.listaInventario.iterator();
        while (iter.hasNext()) {
            Inventario inventario = (Inventario) iter.next();
            if (inventario.getCantidad() > 0) {
                mueblesdisponibles.add(catalogService.findMuebleById(inventario.getReferencia()));
            }
        }
        return mueblesdisponibles;
    }

    @PostConstruct
    public void getAllMuebles() {
        this.listaMuebles = (List<Mueble>) catalogService.findAllMuebles();
        this.ultimaBusqueda = "AM";
    }

    public void getAllInventario() {
        this.listaInventario = catalogService.findAllInventario();
    }

    public SelectItem[] getTiposMuebles() {
        TipoMueble[] tipos = TipoMueble.values();
        SelectItem[] sitems = new SelectItem[tipos.length];
        for (int i = 0; i < sitems.length; i++) {
            sitems[i] = new SelectItem(tipos[i]);
        }
        return sitems;
    }

    public String add() {
        try {
            catalogService.add(mueble);
            this.newMueble();
            repetriBusqueda();
            return "success";
        } catch (Exception e) {
            return "failed";
        }
    }

    public Inventario getInventario() {
        return inventario;
    }

    public void setInventario(Inventario inventario) {
        this.inventario = inventario;
    }

    public Mueble getMueble() {
        // cargo el inventario del mueble especificado
        inventario = catalogService.findInventarioMueble(mueble.getReferencia());
        return mueble;
    }

    public void setMueble(Mueble cMueble) {
        this.mueble = cMueble;
    }

    /**
     * Borra el mueble seleccionado
     */
    public String delete() {
        try {
//            if (this.referencia.length() > 0) {
//                catalogService.delete(this.referencia);
//
//            } else {
//                catalogService.delete(this.mueble.getReferencia());
//            }
//            this.newMueble();
//            repetriBusqueda();
            this.catalogService.delete(this.referencia);
            this.mueble = new Mueble();
            this.getAllMuebles();
            return "success";
        } catch (Exception e) {
            return "failed";
        }

    }

    public String getMuebleByRef() {

        this.mueble = this.catalogService.getMueblebyRef(this.referencia);
        if (this.mueble != null) {
            return "modificar";
        } else {
            return "noexiste";
        }
    }

    public String getValorMuebleByRef() {
        this.mueble = catalogService.findMuebleById(this.referencia);
        if (this.mueble != null) {
            return "modificar";
        } else {
            return "noexiste";
        }
    }

    public void newMueble() {
        mueble = new Mueble();
    }

    public void getMueblesByTipo() {
        this.listaMuebles = (List<Mueble>) catalogService.findMuebleByTipo(mueble.getTipo());
        this.ultimaBusqueda = "BT";
    }

    public void getMueblesByName() {
        this.listaMuebles = (List<Mueble>) catalogService.findMuebleByName(mueble.getNombre());
        this.ultimaBusqueda = "BN";

    }

    public void getMueblesByRef() {
        this.listaMuebles = (List<Mueble>) catalogService.findMuebleByRef(mueble.getReferencia());
        this.ultimaBusqueda = "BR";
    }

    public double findValorInventario(String referencia) {
        Inventario inventario = catalogService.findInventarioMuebleByRef(referencia);
        return inventario.getPrecio();
    }

    /**
     * agrega o actualiza el precio y la cantidad del inventario
     */
    public String addInventario() {
        try {
            catalogService.addInventario(this.inventario);
            return "success";
        } catch (Exception e) {
            return "failed";
        }
    }

    /**
     * opciones para navegacion entre paginas
     */
    public String back() {
        return "back";
    }

    public String registrarPrecio() {
        this.inventario.setReferencia(this.referencia);
        return "registroprecio";
    }

    /**
     * repite la ultima búsqueda realizada, con el fin de tener acualizada la lista
     */
    private void repetriBusqueda() {
        if (this.ultimaBusqueda.equals("BN")) {
            this.getMueblesByName();
        } else if (this.ultimaBusqueda.equals("BR")) {
            this.getMueblesByRef();
        } else if (this.ultimaBusqueda.equals("BT")) {
            this.getMueblesByTipo();
        } else {
            this.getAllMuebles();
        }
    }
}
